from wtforms import Form
from app.libs.error_code import ParameterError


class BaseForm(Form):
    ''' 继承Form,让新的类直接抛出异常给到前端,这样即保留了Form验证的便捷,又可以直接返回error信息.'''
    def __init__(self, data):
        # TODO 为什么要重写__init__呢?如果只是为了传入data参数的话,是不是有点多余呢?
        # 不会多余,因为我们会在这里加上自己的请求参数接受逻辑(只不过我这里没有写而已),因为我觉得在视图函数里接受的话,可读性会更强
        super(BaseForm, self).__init__(data=data) # 这个data是我们传入验证的数据

    def validate_for_api(self):
        '''
            先调用validate方法进行验证,如果有error将返回False,然后将保存error信息的容器直接当做异常抛出
            重点: 原来的validate方法是把error信息保存起来,让我们选择怎么操作,所以我们在前后端分离的模式下,直接将error信息
                 通过自定义的异常对象进行抛出
            感想: 当扩展的功能和需求不匹配时,我们重写一些关键方法,达到自己的效果
        '''
        valid = super(BaseForm, self).validate()
        if not valid:
            # 使用一个自定义的异常对象完成最后的异常处理.
            raise ParameterError(msg=self.errors)
        # 这里返回self是为了链式调用
        return self
